import ilog.concert.IloException;
import ilog.concert.IloNumVar;
import ilog.cplex.IloCplex;
public class cplex_1 {
    public static  void main(String[] args) throws IloException {
        //声明cplex优化模型
        IloCplex cplex = new IloCplex();

        //设定变量上下限
        double[] lb = {0.0,0.0,0.0};
        double[] ub = {40.0,Double.MAX_VALUE,Double.MAX_VALUE};

        //定义优化变量，IloNumber，3维，以及对应的边界（3维是什么意思？这个边界是每一个维度的上下边界吗？）
        //就是三个变量x[0],x[1],x[2]
        //这是直接定义三个变量
        IloNumVar[] x = cplex.numVarArray(3,lb,ub);

        //设定目标函数
        //存储目标函数中每个决策变量的系数
        double[] objvals = {1.0,2.0,3.0};
        //目标函数表达式为1.0*x[0]+2.0*x[1]+3.0*x[2]，并最大化这个目标函数
        cplex.addMaximize(cplex.scalProd(x,objvals));

        //设定约束条件
        double[] coeff1 = {-1.0,1.0,1.0};//第一组约束条件的系数
        double[] coeff2 = {1.0,-3.0,1.0};//第二组约束条件的系数
        //addLe：Le表示小于等于的意思
        cplex.addLe(cplex.scalProd(x,coeff1),20.0);
        cplex.addLe(cplex.scalProd(x,coeff2),30.0);

        //模型求解
        if (cplex.solve()) {
            // cplex.output()，数据输出，功能类似System.out.println();
            cplex.output().println("Solution status = " + cplex.getStatus());  // cplex.getStatus：求解状态，成功则为Optimal
            // cplex.getObjValue()：目标函数的最优值
            cplex.output().println("Solution value = " + cplex.getObjValue());
            // cplex.getValues(x)：变量x的最优值
            double[] val = cplex.getValues(x);
            for (int j = 0; j < val.length; j++)
                cplex.output().println("x" + (j+1) + "  = " + val[j]);
        }

        cplex.end();
    }
}
